package com.base.proxy.jdk.custom.proxy;



import com.base.proxy.jdk.custom.Invisible.ZtoClassLoader;
import com.base.proxy.jdk.custom.Invisible.ZtoInvocationHandler;
import com.base.proxy.jdk.custom.Invisible.ZtoProxy;
import com.base.proxy.jdk.custom.service.ExpressService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by xingyuchao on 2017-06-13.
 * 定义一个中通快递中间类(代理处理器)
 *
 */
public class ZtoExpressProxy implements ZtoInvocationHandler {

    /*要代理的目标对象*/
    private ExpressService target;

    /*创建并返回生成的代理对象*/
    public Object getZtoExpressProxy(ExpressService target){
        this.target = target;

        Class clazz = target.getClass();
        System.out.println("被代理对象的class是:"+clazz);
        /**
         * ClassLoader loader  代理对象由哪一个类加载器加载
         * Class<?>[] interfaces 代理对象的类型
         * InvocationHandler h 处理代理实例接口调用的处理器
         */
        return ZtoProxy.newProxyInstance(new ZtoClassLoader(), clazz.getInterfaces(), this);
    }

    /**
     * 当调用代理对象其中的方法时，该执行的代码
     * @param proxy 正在返回的那个代理对象，一般情况下，在invoke方法中不使用该对象
     * @param method  正在被调用的那个方法
     * @param args  调用方法时，传递的参数
     * @return 目标方法返回值
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行需要被代理的方法");
        Object invoke = method.invoke(target, args);
        System.out.println("执行完成被代理的方法,"+invoke);
        return invoke;
    }
}
